/**
 *  通过本文件导出的default*若干对象用于redux构建
 *  初始state。
 */

import { fromJS } from 'immutable';
import { isMobile } from '../utils/utils';

let cookie = {};

/**
 *  读取cookie，当页面请求来源于微信图文消息时，服务端通过
 *  cookie传输必要数据。
 */
document.cookie.split(';').forEach( ele => {
    let match = ele.match( /^(.*?)=(.*)$/ );
    if (match && match.length === 3) {
        let key = match[1].trim();
        let value = match[2].trim();
        cookie[key] = decodeURIComponent(value);
    }
});

// 以下几个default***State均为非微信状态。
let defaultBookState = {
    render: {
        all: undefined,
        allpage: undefined,
        keywords: undefined,
        nowpage: undefined,
        timestamp: undefined,
        books: []
    },
    unrender: {
        // keyword字段承担两个作用：
        // 1. 在每次搜索后，分页器需要根据这个字段请求下一页
        // 2. 从微信进来的页面需要根据这个字段发请求
        keyword: undefined,
        // 根据微信的关键字搜索图书后，查看某本书的详情，此时
        // 界面滚动到书所在的位置，offset为书的偏移量
        offset: undefined
    }
};

let defaultUserState = {
    render: {
        bind: undefined,
        book: [],
        canrenew: undefined,
        count: undefined,
        subscibe: [],
        timestamp: undefined,
        usercookie: undefined,
        user: undefined
    },
    unrender: {
        isLogin: false,
        // 控制userpanel是否展开，移动端默认不展开
        isSpread: isMobile ? false : true,
        // 浏览器环境是否为微信
        isWX: /MicroMessenger/.test(navigator.userAgent),
        // 默认情况下没有WXID，当cookie中有OpenID时此字段被填充
        WXID: undefined,
        // 当环境为微信且未绑定畅校园时，通过此字段显示绑定按钮
        isGoBind: false,
        // 当前用户是否绑定了畅校园， true/false
        isBind: undefined
    }
};

let defaultAsideState = {
    render: {
        book: undefined,
        isLike: false,
        douban: {
            isbn: undefined,
            summary: undefined,
            link: undefined
        }
    },
    unrender: {
        // 控制aside是否展开，默认不展开
        isSpread: false
    }
};

let defaultMessageState = {
    'text': null,
    'isShow': false,
    // TODO: action字段功能待补充
    'action': undefined
};

/**
 *  通过原始state创建原始immutable state，因为在某些操作例如登出
 *  ，删除搜索字段后，view需要恢复页面加载时的初始状态，此时应用
 *  这些原始immutable state即可。
 */
let defaultBookState_RAW = fromJS( defaultBookState );
let defaultUserState_RAW = fromJS( defaultUserState );
let defaultAsideState_RAW = fromJS( defaultAsideState );
let defaultMessageState_RAW = fromJS( defaultMessageState );

/**
 *  当cookie字段中from字段等于wx时，说明需要从cookie中读取相关
 *  字段用于自动登录的数据加载。当用户通过微信打开图书馆时，服
 *  务端会返回304，304目标地址为图书馆真实地址，同时在这个请求
 *  中会设置用于发起自动登录的微信OpenID, from, bind, ac字段，
 *  通过OpenID可以直接查询用户信息，from用于标明页面来源来自
 *  wechat，bind字段指明用户是否已绑定畅校园，ac字段指示页面加
 * 载时默认执行什么动作。
 */
if (cookie.from === 'wx') {

    defaultUserState.unrender.WXID = cookie.id;

    // 从服务端通过OpenID请求用户信息，实现免登录 #TODO
    // function fetchUserInfoByOpenID(OpenID){
        
    // }

    switch( cookie.ac ){
        // 点击最大的图文消息进入图书馆（未绑定／已绑定）
        // 不展开userpanel，但如果用户未绑定，则显示绑定按钮
        case 'search':
            // fetchUserInfoByOpenID();
            break;

        // 点击图文消息的绑定账号（未绑定）
        // userpanel展开，显示绑定按钮
        case 'bind':
            defaultUserState.unrender.isSpread = true;
            defaultUserState.unrender.isGoBind = true;
            break;

        // 点击图文消息的借、藏、期、续（已绑定）
        case 'center':
            // fetchUserInfoByOpenID();
            defaultUserState.unrender.isSpread = true;
            break;

        // 根据微信的关键字搜索图书后，查看某本书的详情（已绑定／未绑定）
        case 'bookdetail':
            // fetchUserInfoByOpenID();

            defaultBookState.unrender.keyword = cookie.kw;
            defaultBookState.unrender.offset = cookie.in;

            defaultAsideState.unrender.isSpread = true;
            defaultAsideState.render.book = JSON.parse( cookie.de );
            defaultAsideState.render.isLike = cookie.uD === undefined ? false :
                defaultUserState.render.subscibe.some( b => b.ctrlid === defaultAsideState.render.book.detail );
            break;

        // 根据微信的关键字搜索图书后，点击查看更多按钮（已绑定／未绑定）
        case 'more':
            defaultBookState.unrender.keyword = cookie.kw;
            defaultBookState.unrender.offset = cookie.in;
            break;
    }
}

/**
 *  经过有可能的初始数据操作后的state用于页面加载时的初始状态，
 *  这与上面提到的原始state不同，下面的state仅在页面加载时
 *  使用，而原始state用于登出，删除搜索字段等需要恢复原始
 *  状态的场景。
 */
defaultBookState = fromJS( defaultBookState );
defaultUserState = fromJS( defaultUserState );
defaultAsideState = fromJS( defaultAsideState );
defaultMessageState = fromJS( defaultMessageState );


export {
    defaultBookState,
    defaultUserState,
    defaultAsideState,
    defaultMessageState,
    defaultBookState_RAW,
    defaultUserState_RAW,
    defaultAsideState_RAW,
    defaultMessageState_RAW
};
